package com.boot.study.jianfan;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.ObjectId;
import lombok.extern.slf4j.Slf4j;
import org.dromara.pdf.fop.doc.XEasyPdfTemplateDocument;
import org.dromara.pdf.fop.doc.bookmark.XEasyPdfTemplateBookmark;
import org.dromara.pdf.fop.doc.component.XEasyPdfTemplateComponent;
import org.dromara.pdf.fop.doc.component.block.XEasyPdfTemplateBlockContainer;
import org.dromara.pdf.fop.doc.component.page.XEasyPdfTemplateCurrentPageNumber;
import org.dromara.pdf.fop.doc.component.page.XEasyPdfTemplateTotalPageNumber;
import org.dromara.pdf.fop.doc.component.table.XEasyPdfTemplateTable;
import org.dromara.pdf.fop.doc.component.table.XEasyPdfTemplateTableBody;
import org.dromara.pdf.fop.doc.component.table.XEasyPdfTemplateTableRow;
import org.dromara.pdf.fop.doc.component.text.XEasyPdfTemplateText;
import org.dromara.pdf.fop.doc.page.XEasyPdfTemplatePage;
import org.dromara.pdf.fop.handler.XEasyPdfTemplateHandler;
import org.junit.Test;

import java.util.Date;

/**
 * @author lkz
 * @className FormPdfDemo
 * @description 书签页面测试
 * @date 2024/3/1 15:49
 **/
@Slf4j
public class FormPdfDemo {


    private final String pageId="pageId";

    @Test
    public void createDocument() {
        String outPath = "D:\\pdf\\jianfan\\" + ObjectId.next() + ".pdf";
        // 创建文档
        XEasyPdfTemplateDocument document = XEasyPdfTemplateHandler.Document.build();
        // 创建封面
        XEasyPdfTemplatePage page = XEasyPdfTemplateHandler.Page.build();
                page.setId("1")
                .setMarginTop("70pt").setMarginLeft("20pt")
               .setMarginRight("20pt")
                        .setFontFamily("宋体");
                // 创建标题文本
        XEasyPdfTemplateText titleText = XEasyPdfTemplateHandler.Text.build();
               // .setHorizontalStyle(XEasyPdfPositionStyle.CENTER.name());
        titleText.setText("白蛋白紫杉醇联合马来酸吡咯替尼在HER2阳性早期乳腺癌术后辅助治疗中的单臂多中心II期临床研究")
               // .setTextIndent("60pt") // 文本缩进
                .setFontSize("28pt").setFontFamily("宋体");
        // 创建小标题
        XEasyPdfTemplateText smallTitleText = XEasyPdfTemplateHandler.Text.build().setHorizontalStyle("center");
        smallTitleText.setFontFamily("宋体")
                .setText("受试者病例报告表").setMarginTop("27pt").setFontSize("20pt")
                .setMarginBottom("10pt");
        // 创建标题英文
        XEasyPdfTemplateText smallEnglishTitleText = XEasyPdfTemplateHandler.Text.build().setHorizontalStyle("center");
        smallEnglishTitleText.setFontFamily("宋体")
                .setText("Subject Case Report Form").setFontSize("18pt").setMarginBottom("50pt");
        // 方案版本号
        XEasyPdfTemplateText meVerText = this.buildCoverText("方案版本号:" + "12", "10pt", "5pt");
        //方案版本日期
        XEasyPdfTemplateText metVerTimeText = this.buildCoverText("方案版本日期: "+DateUtil.format(new Date(), "yyyy-MM-dd"), "10pt", "5pt");
        //eCRF版本号
        XEasyPdfTemplateText eCRFVText = this.buildCoverText("eCRF版本号: "+"V2.0", "10pt", "5pt");
        // eCRF版本 日期
        XEasyPdfTemplateText eCRFTimeText = this.buildCoverText("eCRF版本日期: "+DateUtil.format(new Date(), "yyyy-MM-dd"), "10pt", "10pt");


        // 创建表格
        XEasyPdfTemplateTable table = XEasyPdfTemplateHandler.Table.build();
        table.setMarginLeft("150pt")
                .setFontFamily("宋体");
        table.setBody(this.createPageTableData());

        // 申请单位
        XEasyPdfTemplateText applyText = XEasyPdfTemplateHandler.Text.build().setText("申办单位:北京协和医院")
                .setFontSize("15pt").setMarginBottom("5pt").setHorizontalStyle("center")
                .setFontFamily("微软雅黑")
                .setFontWeight("bolder").setMarginTop("80pt");
        // 生成时间
        XEasyPdfTemplateText creatTimeText = this.buildCoverText("生成时间:" + DateUtil.format(new Date(), "yyyy-MM-dd"), "10pt", "20pt");
        page.addBodyComponent(titleText,smallTitleText,smallEnglishTitleText,
                meVerText,metVerTimeText,eCRFVText,eCRFTimeText,table,applyText,creatTimeText);

        // 创建容器
        XEasyPdfTemplateBlockContainer container = XEasyPdfTemplateHandler.BlockContainer.build();
//        // 创建当前页码
//        XEasyPdfTemplateCurrentPageNumber currentPageNumber = XEasyPdfTemplateHandler.CurrentPageNumber.build();
//        // 创建总页码
//        XEasyPdfTemplateTotalPageNumber totalPageNumber = XEasyPdfTemplateHandler.TotalPageNumber.build().setPageId(pageId);
//        // 页面最后
//        XEasyPdfTemplateText pageIndex = XEasyPdfTemplateHandler.Text.build().setText(" 页");
//        // 创建当前页码文本
//        XEasyPdfTemplateText currentText = XEasyPdfTemplateHandler.Text.build().setText("当前第 ").setFontSize("10pt");
//        // 创建总页码文本
//        XEasyPdfTemplateText totalText = XEasyPdfTemplateHandler.Text.build().setText(" 页/共 ").setFontSize("10pt");
//        // 添加容器内组件
//        container.addComponent(currentText, currentPageNumber, totalText, totalPageNumber,pageIndex)
//                .setHorizontalStyle("center");
        container.addComponent(this.buildPageNumber());
        // 设置页眉高度并添加页眉组件
        //page.setHeaderHeight("20pt").addHeaderComponent(container);
        // 创建页脚
        page.setFooterHeight("20pt").addFooterComponent(container);
        // 添加页面
        document.addPage(page);
        // 设置封面书签
        document.addBookmark(this.createBookmark("封面","1"));
        // 受试者页面
        document.addPage(this.createSubPage());
        document.addBookmark(this.createBookmark("受试者信息",pageId));


        // 转换pdf
        document.transform(outPath);


    }

    /**
     * 创建受试者信息表
     * @return
     */
    public XEasyPdfTemplatePage createSubPage(){

        XEasyPdfTemplatePage subPage = XEasyPdfTemplateHandler.Page.build();
        subPage.setFontFamily("宋体").setMarginLeft("45pt").setBodyMarginTop("14pt").setMarginTop("28pt");
        subPage.setId(pageId);
        // 添加页眉
        subPage.setHeaderHeight("30pt").setMarginLeft("45pt").addHeaderComponent(this.createPageHeader());
        // 设置受试者表格内容
        XEasyPdfTemplateTable table = XEasyPdfTemplateHandler.Table.build();
        table.setVerticalStyle("center").setFontFamily("宋体").setFontSize("10pt")
                .setWidth("500pt").setMinRowHeight("30pt");
        table.setBody(XEasyPdfTemplateHandler.Table.Body.build().addRow(
                XEasyPdfTemplateHandler.Table.Row.build()
                        //.setBorder("1 solid black")
                        .addCell(XEasyPdfTemplateHandler.Table.Cell.build()
                                .setHeight("30pt").setBackgroundColor("#8FBC8F")
                                .addComponent(buildText("受试者信息表")).setColumnSpan(2)),
                XEasyPdfTemplateHandler.Table.Row.build().setBorder("1 solid black")
                        .addCell(XEasyPdfTemplateHandler.Table.Cell.build()
                                .addComponent(buildText("研究代码")),
                                XEasyPdfTemplateHandler.Table.Cell.build()
                                        .addComponent(buildText("02536"))),
                XEasyPdfTemplateHandler.Table.Row.build().setBorder("1 solid black")
                        .addCell(XEasyPdfTemplateHandler.Table.Cell.build()
                                        .addComponent(buildText("中心名称")),
                                XEasyPdfTemplateHandler.Table.Cell.build()
                                        .addComponent(buildText("健帆信息"))),
                XEasyPdfTemplateHandler.Table.Row.build().setBorder("1 solid black")
                        .addCell(XEasyPdfTemplateHandler.Table.Cell.build()
                                        .addComponent(buildText("中心编号")),
                                XEasyPdfTemplateHandler.Table.Cell.build()
                                        .addComponent(buildText("001"))),
                XEasyPdfTemplateHandler.Table.Row.build().setBorder("1 solid black")
                        .addCell(XEasyPdfTemplateHandler.Table.Cell.build()
                                        .addComponent(buildText("研究者")),
                                XEasyPdfTemplateHandler.Table.Cell.build()
                                        .addComponent(buildText(""))),
                XEasyPdfTemplateHandler.Table.Row.build().setBorder("1 solid black")
                        .addCell(XEasyPdfTemplateHandler.Table.Cell.build()
                                        .addComponent(buildText("受试者代码")),
                                XEasyPdfTemplateHandler.Table.Cell.build()
                                        .addComponent(buildText("01235")))
        )).setBorder("1 solid black");

        subPage.addBodyComponent(table);

        // 设置页脚
        subPage.addFooterComponent(
                // 创建块容器并添加内容
//                XEasyPdfTemplateHandler.BlockContainer.build().addComponent(
//                        this.buildPageNumber().setHorizontalStyle("center"))
                this.createPageFoot()
        ).setFooterHeight("30pt");

        return subPage;
    }

    public XEasyPdfTemplateBlockContainer buildPageNumber() {
        // 当前页码
        XEasyPdfTemplateCurrentPageNumber current = XEasyPdfTemplateHandler.CurrentPageNumber.build();
        // 总页码
        XEasyPdfTemplateTotalPageNumber total = XEasyPdfTemplateHandler.TotalPageNumber.build().setPageId(pageId);
        // 创建容器
        return XEasyPdfTemplateHandler.BlockContainer.build().setHorizontalStyle("center")
                .addComponent(buildText("-第"), current, buildText("页/共"), total, buildText("页-").setFontSize("10pt"));
    }

    /**
     * 创建页眉
     * @return
     */
    public XEasyPdfTemplateComponent createPageHeader(){
       return XEasyPdfTemplateHandler.Table.build().setFontSize("12pt").setWidth("500pt").setMinRowHeight("30pt")
                .setFontFamily("宋体").setBorder("1 solid black")
                .setBody(XEasyPdfTemplateHandler.Table.Body.build()
                        .addRow(XEasyPdfTemplateHandler.Table.Row.build()
                                .addCell(XEasyPdfTemplateHandler.Table.Cell.build()
                                        .addComponent(buildText("project_code")),
                                        XEasyPdfTemplateHandler.Table.Cell.build()
                                                .addComponent(buildText("V12").setHorizontalStyle("center")),
                                        XEasyPdfTemplateHandler.Table.Cell.build()
                                                .addComponent(buildText("00198").setHorizontalStyle("end"))
                                        )));



    }

    /**
     * 创建页脚
     * @return
     */
    public XEasyPdfTemplateComponent createPageFoot(){
        return XEasyPdfTemplateHandler.Table.build().setWidth("500pt")


                .setFontFamily("宋体").setBorder("1 solid black")
                .setBody(XEasyPdfTemplateHandler.Table.Body.build()
                        .addRow(XEasyPdfTemplateHandler.Table.Row.build()
                                .addCell(XEasyPdfTemplateHandler.Table.Cell.build()
                                                .addComponent(buildText("v0.008")),
                                        // 页码
                                        XEasyPdfTemplateHandler.Table.Cell.build()
                                                .setHorizontalStyle("center")
                                                .addComponent(this.buildPageNumber()),
                                        XEasyPdfTemplateHandler.Table.Cell.build()
                                                .addComponent(buildText(DateUtil.format(new Date(),"yyyy-MM-dd")).setHorizontalStyle("end"))
                                )));



    }




    /**
     * 创建书签对象
     * @param pageBook 书签名称
     * @param pageId 书签组件id
     * @return
     */
    public XEasyPdfTemplateBookmark createBookmark(String pageBook, String pageId){
        XEasyPdfTemplateBookmark bookmark = XEasyPdfTemplateHandler.Bookmark.build();
        bookmark.setTitle(pageBook)
                // 设置内部地址
                .setInternalDestination(pageId);

        return bookmark;
    }

    /**
     * 封面表格数据
     * @return
     */
    public XEasyPdfTemplateTableBody createPageTableData(){
        XEasyPdfTemplateTableBody xEasyPdfTemplateTableBody = XEasyPdfTemplateHandler.Table.Body.build().
                addRow(
                this.builderRow2("研究代码","v12"),
                this.builderRow2("临床实验组长单位","清风集团"),
                this.builderRow2("主要研究","李医生"),
                this.builderRow2("代码","00021")
        );
        return xEasyPdfTemplateTableBody;
    }

    /**
     * 创建单元格
     * @param key
     * @param value
     * @return
     */
    private XEasyPdfTemplateTableRow builderRow(String key, String value) {
        return XEasyPdfTemplateHandler.Table.Row.build().setVerticalStyle("center").addCell(
                XEasyPdfTemplateHandler.Table.Cell.build()
                        .setBorder("0")
                        .addComponent(buildText("")),
                XEasyPdfTemplateHandler.Table.Cell.build()
                        .setHorizontalStyle("end")
                        .setBorder("1 solid black")
                        .addComponent(buildText(key).setMargin("0").setMarginRight("10pt")),
                XEasyPdfTemplateHandler.Table.Cell.build()
                        .setBorder("1 solid black")
                        .addComponent(buildText(value).setMargin("0").setMarginLeft("10pt")),
                XEasyPdfTemplateHandler.Table.Cell.build()
                        .setBorder("0")
                        .addComponent(buildText("")));
    }
    public XEasyPdfTemplateTableRow builderRow2(String key,String value){
        return XEasyPdfTemplateHandler.Table.Row.build().setVerticalStyle("center").addCell(

                XEasyPdfTemplateHandler.Table.Cell.build()
                        .setHorizontalStyle("end")
                        .setBorder("1 solid black")
                        .addComponent(buildText(key).setMarginRight("10pt")),
                XEasyPdfTemplateHandler.Table.Cell.build()
                        .setBorder("1 solid black")
                        .addComponent(buildText(value).setMarginLeft("10pt")));

    }


    /**
     *
     * @param text 文本
     * @param fontSize 字体大小
     * @param marginBottom 下边界
     * @return
     */
    private XEasyPdfTemplateText buildCoverText(String text, String fontSize, String marginBottom) {
        return buildText(text)
                .setFontSize(fontSize)
                .setHorizontalStyle("center")
                .setFontFamily("宋体")
                .setMarginBottom(marginBottom);
    }

    /**
     * 构造文本对象
     *
     * @param text 文本内容
     * @return 文本对象
     */
    private static XEasyPdfTemplateText buildText(String text) {
        return XEasyPdfTemplateHandler.Text.build().setText(text);
    }

}
